$(function(){
    Validate._addMethods();
});

Validate = {
        _addMethods : function(){

            $.validator.addMethod("cpf", function(value, element, type) {   
                if (this.optional(element)) return true;
                cpf = value.replace(/\.|-|\//gi,'');
                while(cpf.length < 11) 
                    cpf = "0"+ cpf;
                var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
                var a = [];
                var b = new Number;
                var c = 11;
                for (i=0; i<11; i++){
                    a[i] = cpf.charAt(i);
                    if (i < 9) b += (a[i] * --c);
                }
                a[9] = ((x = b % 11) < 2) ? 0 : 11-x;
                b = 0;
                c = 11;
                for (y=0; y<10; y++) 
                    b += (a[y] * c--);
                a[10] = ((x = b % 11) < 2) ? 0 : 11-x;
                
                return ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) ? false : true;
            }, "CPF inválido.");
            
            $.validator.addMethod("dateBR", function(value, element) {
                return this.optional(element) || /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$/.test(value);
            }, "Data inválida.");
            
            $.validator.addMethod("maxdecimal", function(value, element, param) {
              value = value.replace(/\./g, '');
              value = parseFloat(value.replace(',', '.'));
        return this.optional(element) || value <= param;
      }, $.validator.format("O valor deve ser menor ou igual a {0}."));
            
            $.validator.addMethod("mindecimal", function(value, element, param) {
        value = value.replace(/\./g, '');
        value = parseFloat(value.replace(',', '.'));
        return this.optional(element) || value >= param;
      }, $.validator.format("O valor deve ser maior ou igual a {0}."));
            
            $.validator.addMethod("cnpj", function(cnpj, element) {
                if (this.optional(element)) return true;
                
                cnpj = jQuery.trim(cnpj);
                cnpj = cnpj.replace('/','');
                cnpj = cnpj.replace('.','');
                cnpj = cnpj.replace('.','');
                cnpj = cnpj.replace('-','');
                 
                var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
                digitos_iguais = 1;
                 
                if (cnpj.length < 14 && cnpj.length < 15)
                    return false;

                for (i = 0; i < cnpj.length - 1; i++){
                    if (cnpj.charAt(i) != cnpj.charAt(i + 1)){
                        digitos_iguais = 0;
                        break;
                    }
                }
                 
                if (!digitos_iguais) {
                    tamanho = cnpj.length - 2;
                    numeros = cnpj.substring(0,tamanho);
                    digitos = cnpj.substring(tamanho);
                    soma = 0;
                    pos = tamanho - 7;
                 
                    for (i = tamanho; i >= 1; i--){
                        soma += numeros.charAt(tamanho - i) * pos--;
                        if (pos < 2)
                            pos = 9;
                    }
                    
                    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
                    if (resultado != digitos.charAt(0))
                        return false;

                    tamanho = tamanho + 1;
                    numeros = cnpj.substring(0,tamanho);
                    soma = 0;
                    pos = tamanho - 7;
                    for (i = tamanho; i >= 1; i--){
                        soma += numeros.charAt(tamanho - i) * pos--;
                        if (pos < 2)
                            pos = 9;
                    }
                    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
                    if (resultado != digitos.charAt(1))
                        return false;
                    return true;
                }
                else
                    return false;
                }, "Informe um CNPJ válido.");
        }
        
};